package ref;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;

/**
 * @Author com.alibaba.lizhen
 * @Date 2021/3/23 10:13 下午
 * @Version 1.0
 * @Description
 *
 *定义：若 Lambda 表达式体中的内容已有方法实现，则我们可以使用“方法引用”
 *
 * 语法格式：
 *
 * 对象 :: 实例方法
 * 类 :: 静态方法
 * 类 :: 实例方法
 *
 * 注意：1、Lambda 表达实体中调用方法的参数列表、返回类型必须和函数式接口中抽象方法保持一致
 * 2、若lambda参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName::method
 */
public class MethodRefTest {
    /**
     * 类::实例方法
     * 若lambda参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName::method
     */
    @Test
    public void test03(){
        BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
        System.out.println(bp1.test("a","b"));

        BiPredicate<String, String> bp2 = String::equals;
        System.out.println(bp2.test("c","c"));
    }


    /**
     * 类::静态方法
     */
    @Test
    public void test02(){
        Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
        System.out.println(com1.compare(1, 2));

        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com2.compare(2, 1));
    }


    /**
     * 对象::实例方法
     */
    @Test
    public void test1() {
        Consumer<Integer> consumer = (x) -> System.out.println(x);
        // public final static PrintStream out = System.out
        consumer = System.out::println;

        consumer.accept(100);
    }
}
